﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Configuration;
using System.Text.RegularExpressions;
using Fleck;

namespace Seeker.AdminUI.Services
{
    public class SocketServer
    {
        public SocketServer()
        {
            Regex param = new Regex(@"[\w\d_]+=[^&]+");
            FleckLog.Level = LogLevel.Error;
            var allSockets = new List<IWebSocketConnection>();
            var server = new WebSocketServer(ConfigurationManager.AppSettings["SocketServer"]);
            server.Start(socket =>
            {
                socket.OnOpen = () =>
                {
                    //记录cookie，用于辨别具体用户。
                    //try
                    //{
                    //    MatchCollection mc = param.Matches(socket.ConnectionInfo.Path);
                    //    int uid = 0;
                    //    string key = "";
                    //    for (int i = 0; i < mc.Count; i++)
                    //    {
                    //        string k = mc[i].Value.ToLower();
                    //        string v = k.Substring(k.IndexOf("="));
                    //        if (k.Contains("uid"))
                    //        {
                    //            uid = Convert.ToInt32(v);
                    //        }
                    //        if (k.Contains("key"))
                    //        {
                    //            key = v;
                    //        }
                    //    }

                    //    if (new Seeker.Business.Admin.AdminUsers().LoginVerify(uid, key))
                    //    {
                    //        if (key == "")
                    //        {
                    //            socket.Close();
                    //        }

                    //        socket.ConnectionInfo.Cookies.Add("UID", uid.ToString());
                    //        allSockets.Add(socket);
                    //    }
                    //    else
                    //    {
                    //        socket.Close();
                    //    }
                    //}
                    //catch
                    //{
                    //    socket.Close();
                    //}
                    allSockets.Add(socket); 
                };
                socket.OnClose = () =>
                {
                    allSockets.Remove(socket);
                };
                socket.OnMessage = message =>
                {
                    allSockets.ToList().ForEach(s =>
                    {
                        //if (Convert.ToInt32(s.ConnectionInfo.Cookies["ClientPort"]) % 5 == 0) 
                        s.Send(message);
                    });
                };
            });
        }
    }
}